/**
 * @file: JugadorReal.cpp.
 * @author: Edwin Marcelo Guzman Buezo.
 * @date: MAY-18-2009.
 * @desc: Este archivo contiene la clase JugadorReal.
 */

#include<iostream>
#include<vector>
#include<string>
#include "JugadorReal.h"
#include "Jugador.h"
#include "Carta.h"
#include "Constantes.h"
using namespace std;

JugadorReal::JugadorReal(string nombre){
    setNombre(nombre);
    setFichas(0);
    }

JugadorReal::JugadorReal(string nombre, int fichas){
    setNombre(nombre);
    setFichas(fichas);
    }

JugadorReal::JugadorReal(){}

JUGADA JugadorReal::jugar(int& apuestaActual,vector<Carta*> cartasEnMesa,int& apuestaDeEsteJugador){
    JUGADA value;
    do{
        leerComando(cartasEnMesa,apuestaActual,apuestaDeEsteJugador);
        value = ejecutarComando(apuestaActual,apuestaDeEsteJugador);
    }while( ERROR == value);
    return value;
    }

bool JugadorReal::validarComando(string comAux){
    if(comAux == "pasar")return true;
    if(comAux == "retirarse")return true;
    string aux="";
    int i=0, n=0;
    while(comAux[i]!=' ' && comAux[i]!=0){
        aux += comAux[i];
        i++;
        }
    i++;
    if(aux == "apostar"){
        while(comAux[i]!=0){
            if(comAux[i]>='0' && comAux[i]<='9'){
                n += (int)(comAux[i]-'0');
                }
            else{
                cout<<endl<<"SOLO SE PUEDE APOSTAR CON NUMEROS"<<endl<<endl;
                return false;
                }
            i++;
            }
        if(n <= JugadorReal::getFichas()){
            return true;
            }
        }
    cout<<endl<<"LOS COMANDOS INGRESADOS NO SON LOS ADECUADOS"<<endl<<endl;
    return false;
}

void JugadorReal::leerComando(vector<Carta*> mesa,int apuestaActual,int apuestaDeEsteJugador){
    
    string aux;
    Carta a;
    vector<Carta*>::iterator it;
    do{
        vector<Carta*> impCartas, impCartas2;
        cout<<endl<<"####################################"<<endl;
        cout<<"####################################"<<endl;
        cout<<endl<<"Jugador: "<<getNombre()<<"  total fichas: "<<getFichas()<<endl<<"Apuesta Actual:"<<apuestaDeEsteJugador<<endl<<endl;
        cout<<"Apuesta Minima: "<<apuestaActual<<endl<<endl;
        cout<<"Mesa:"<<endl<<endl;
    
        for(it = mesa.begin(); it!= mesa.end() ; it++){
            impCartas2.push_back( (*it) );
            }
        a.printCartasVector(impCartas2);
        cout<<endl<<"Mano:"<<endl<<endl;
        
        Mano auxMano = getMano();
        impCartas.push_back( new Carta(ESPADA,J_JOTA) );
        impCartas.push_back( new Carta(DIAMANTE,J_JOTA) );
        Carta a;
        a.printCartasVector(impCartas);
        
        cout<<endl<<"Realise su jugada"<<endl<<endl;
        cout<<"Los comandos son los siguientes:"<<endl;
        cout<<"pasar        Ejemplo: pasar"<<endl;
        cout<<"apostar x    Ejemplo: apostar 100"<<endl;
        cout<<"retirarse    Ejemplo: retirarse"<<endl<<endl;
    
        getline(cin,aux);
        _comando = aux;
        cout<<endl<<"####################################"<<endl;
    }while(!validarComando(_comando));
    }

//0=RETIRARSE, 1=PASAR, 2=APOSTAR, 3=ALLIN, 4=ERROR.
JUGADA JugadorReal::ejecutarComando(int& apuestaActual,int& apuestaDeEsteJugador){
    if(_comando == "pasar"){
        if( pasar(apuestaActual,apuestaDeEsteJugador) ){
            return PASAR;
            }
        else{
            return ERROR;
            }
        }
    else{
        if(_comando == "retirarse"){
            JugadorReal::retirarse();
            return RETIRARSE;
            }
        else{
            string aux="";
            int i=0, n=0;
            while(_comando[i]!=' '){
                aux += _comando[i];
                i++;
                }
            i++;
            while(_comando[i]!=0){
                n = (n*10) + (int)(_comando[i]-'0');
                i++;
                }
            return JugadorReal::apostar(apuestaActual,apuestaDeEsteJugador,n);
            }
        }
    }
    
void JugadorReal::setComando(string comando){
    _comando = comando;
    }

string JugadorReal::getComando(){
    return _comando;
    }
